home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / PowerMacOberon feb96 / Source / ScrollBars.Mod (.txt) < prev    next >
Oberon Text  |  1995-01-30  |  14KB  |  347 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10b.Scn.Fnt
  3. FoldElems
  4. Syntax10.Scn.Fnt
  5.         lowerCol, upperCol : INTEGER;
  6.     BEGIN
  7.         IF pressed THEN
  8.             lowerCol := lightgrey;
  9.             upperCol := darkgrey;
  10.             INC(patX); DEC(patY)
  11.         ELSE
  12.             lowerCol := darkgrey;
  13.             upperCol := lightgrey
  14.         END;
  15.         Display.ReplConst(lowerCol, X, Y, W, 2, Display.replace);
  16.         Display.ReplConst(lowerCol, X+W-2, Y +2, 2, H-2, Display.replace);
  17.         Display.ReplConst(upperCol, X, Y+2, 2, H-2, Display.replace);
  18.         Display.ReplConst(upperCol, X+2, Y+H-2, W-4, 2, Display.replace);
  19.         Display.Dot(upperCol, X, Y+1, Display.replace);
  20.         Display.Dot(upperCol, X+W-2, Y+H-1, Display.replace);
  21.         Display.ReplConst(middlegrey, X+2, Y+2, W-4, H-4, Display.replace);
  22.         IF pat # 0 THEN
  23.             Display.CopyPattern(black, pat, X + patX, Y + patY, Display.paint)
  24.         END
  25.     END DrawButton;
  26. Syntax10.Scn.Fnt
  27.     BEGIN
  28.         obj.downArrow := downArrow;
  29.         obj.upArrow := upArrow;
  30.         obj.backgroundCol := backgroundCol;
  31.         obj.downW := downPatW; obj.downH := downPatH;
  32.         obj.upW := upPatW; obj.upH := upPatH;
  33.         obj.downdX := 0; obj.downdY := 0;
  34.         obj.updX := 0; obj.updY := 0;
  35.         obj. x := 0; obj.y := 0; obj.w := 0; obj.h := 0;
  36.         obj.sliderdY := 0; obj.sliderH := 0;
  37.         obj.F := NIL
  38.     END Init;
  39. Syntax10.Scn.Fnt
  40.     VAR h, minSliderH: INTEGER;
  41.     BEGIN
  42.         h := obj.h - 2*obj.w;
  43.         minSliderH := obj.minW + obj.minW DIV 2;
  44.         IF h <= minSliderH THEN
  45.             obj.sliderdY := 0; obj.sliderH := h
  46.         ELSIF length = 0 THEN obj.sliderdY := 0; obj.sliderH := h
  47.         ELSIF (beg = 0) & (length = end) THEN obj.sliderdY := 0; obj.sliderH := h
  48.         ELSE
  49.             obj.sliderH := SHORT(((h-minSliderH)*(end-beg)) DIV length);
  50.             IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
  51.             ELSIF obj.sliderH > h THEN obj.sliderH := h  END;
  52.             obj.sliderdY := SHORT(((h-minSliderH)*beg) DIV length);
  53.             IF (beg > 0) & (obj.sliderdY = 0) THEN INC(obj.sliderdY) END;
  54.             IF length = end THEN obj.sliderdY := h - obj.sliderH 
  55.             ELSIF obj.sliderdY + obj.sliderH >= h THEN 
  56.                 obj.sliderH := obj.sliderH - (obj.sliderdY - obj.sliderH) DIV 2;
  57.                 IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
  58.                 ELSIF obj.sliderH > h THEN obj.sliderH := h END;
  59.                 obj.sliderdY := h -  obj.sliderH;
  60.                 IF obj.sliderdY > 1 THEN DEC(obj.sliderdY) END
  61.             END
  62.         END
  63.     END CalculateSliderDim;
  64. Syntax10.Scn.Fnt
  65.     BEGIN
  66.         obj.minW := w;
  67.         obj.x := x; obj.y := y; obj.w := w; obj.h := h;
  68.         IF (obj.minW < obj.downW + 4) & (obj.downW >= obj.upW) THEN obj.minW := obj.downW + 4
  69.         ELSIF (obj.minW < obj.upW + 4) & (obj.upW >= obj.downW) THEN obj.minW := obj.upW + 4
  70.         END;
  71.         obj.downdX := (w - obj.downW) DIV 2; 
  72.         obj.downdY := (w - obj.downH) DIV 2 ;
  73.         obj.updX := (w - obj.upW) DIV 2; 
  74.         obj.updY := (w - obj.upH+1) DIV 2;
  75.         obj.sliderH := w + w DIV 2;
  76.         obj.sliderdY := 0;
  77.     END SetDim;
  78. Syntax10.Scn.Fnt
  79.     BEGIN
  80.     END LineDown;
  81. Syntax10.Scn.Fnt
  82.     BEGIN
  83.     END LineUp;
  84. Syntax10.Scn.Fnt
  85.     BEGIN
  86.     END PageDown;
  87. Syntax10.Scn.Fnt
  88.     BEGIN
  89.     END PageUp;
  90. Syntax10.Scn.Fnt
  91.     VAR x, y, w, h, sdY, sH: INTEGER;
  92.     BEGIN
  93.         x := obj.x; y := obj.y + obj.w;
  94.         w := obj.w; h := obj.h - 2*w;
  95.         sdY := obj.sliderdY; sH := obj.sliderH;
  96.         IF obj.minW # w THEN
  97.             Display.ReplConst(backCol, x, y, w, h, Display.replace)
  98.         ELSIF (h < w + w DIV 2) THEN
  99.             Display.ReplConst(obj.backgroundCol, x, y, w, h, Display.replace)
  100.         ELSE
  101.             IF sdY > 0 THEN
  102.                 Display.ReplConst(obj.backgroundCol, x, y+h-sdY, w, sdY, Display.replace)
  103.             END;
  104.             DrawButton(pressed, 0, 0, 0, x, y+h-sdY-sH, w, sH);
  105.             IF h - sdY - sH > 0 THEN
  106.                 Display.ReplConst(obj.backgroundCol, x, y, w, h - sdY - sH, Display.replace)
  107.             END
  108.         END
  109.     END DrawSlider;
  110. Syntax10.Scn.Fnt
  111.     BEGIN
  112.         obj.CalculateSliderDim(length, beg, end);
  113.         obj.DrawSlider(sliderPressed)
  114.     END Update;
  115. Syntax10.Scn.Fnt
  116.     BEGIN
  117.     END UpdateView;
  118. Syntax10.Scn.Fnt
  119.     VAR pat: Display.Pattern;
  120.     BEGIN
  121.         DrawButton(pressed, obj.downArrow, obj.downdX, obj.downdY, obj.x, obj.y, obj.w, obj.w)
  122.     END DrawDownButton;
  123. Syntax10.Scn.Fnt
  124.     BEGIN
  125.         DrawButton(pressed, obj.upArrow, obj.updX, obj.updY, obj.x, obj.y+obj.h-obj.w, obj.w, obj.w)
  126.     END DrawUpButton;
  127. Syntax10.Scn.Fnt
  128.     BEGIN
  129.         IF obj.h < obj.minW*2 THEN
  130.             Display.ReplConst(obj.backgroundCol, obj.x, obj.y, obj.w, obj.h, Display.replace)
  131.         ELSE
  132.             obj.DrawUpButton(FALSE);
  133.             obj.DrawSlider(FALSE);
  134.             obj.DrawDownButton(FALSE)
  135.         END
  136.     END Draw;
  137. Syntax10.Scn.Fnt
  138.     VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
  139.     BEGIN
  140.         x := obj.x; y := obj.y; w := obj.w; h := w;
  141.         Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  142.         pressed := FALSE;
  143.         suspendTime := Input.Time();
  144.         fast := FALSE;
  145.         REPEAT
  146.             IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my <  y + h) THEN
  147.                 pressed := TRUE;
  148.                 obj.DrawDownButton(pressed)
  149.             ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
  150.                 pressed := FALSE;
  151.                 obj.DrawDownButton(pressed)
  152.             END;
  153.             IF pressed & (keysum # {}) THEN 
  154.                 time := Input.Time();
  155.                 IF time >= suspendTime THEN
  156.                     IF fast THEN suspendTime := time + lowDelay
  157.                     ELSE fast := TRUE; suspendTime := time + middleDelay
  158.                     END;
  159.                     obj.LineUp 
  160.                 END
  161.             END;
  162.             Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  163.             keysum := keysum + keys
  164.         UNTIL keys = {};
  165.         obj.DrawDownButton(FALSE)
  166.     END TrackDownButton;
  167. Syntax10.Scn.Fnt
  168.     VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
  169.     BEGIN
  170.         x := obj.x; y := obj.y + obj.h - obj.w; w := obj.w; h := w;
  171.         Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  172.         pressed := FALSE;
  173.         suspendTime := Input.Time();
  174.         fast := FALSE;
  175.         REPEAT
  176.             IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my <  y + h) THEN
  177.                 pressed := TRUE;
  178.                 obj.DrawUpButton(pressed)
  179.             ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
  180.                 pressed := FALSE;
  181.                 obj.DrawUpButton(pressed)
  182.             END;
  183.             IF pressed & (keysum # {}) THEN
  184.                 time := Input.Time();
  185.                 IF time >= suspendTime THEN
  186.                     IF fast THEN suspendTime := time + lowDelay
  187.                     ELSE fast := TRUE; suspendTime := time + middleDelay
  188.                     END;
  189.                      obj.LineDown
  190.                  END
  191.             END;
  192.             Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  193.             keysum := keysum + keys
  194.         UNTIL keys = {};
  195.         obj.DrawUpButton(FALSE)
  196.     END TrackUpButton;
  197. Syntax10.Scn.Fnt
  198.     VAR 
  199.         keys: SET;
  200.         x, y, w, h, sH, sdY, dY, minH, myOld, myHelp, dYOld, delta: INTEGER;
  201.     BEGIN
  202.         x := obj.x; y := obj.y + obj.w; w := obj.w; h := obj.h - 2*obj.w;
  203.         sH := obj.sliderH; sdY := obj.sliderdY;
  204.         minH := obj.minW + obj.minW DIV 2;
  205.         dYOld := sdY; dY := sdY;
  206.         myOld := my; delta := 0;
  207.         Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  208.         obj.DrawSlider(TRUE);
  209.         REPEAT
  210.             myHelp := my;
  211.             IF (keysum # {}) & (delta # 0) THEN
  212.                 obj.UpdateView(TRUE,dY)
  213.             END;
  214.             Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  215.             keysum := keysum + keys;
  216.             delta := myHelp - my;
  217.             dY := sdY + (myOld - my);
  218.             IF ((delta > 0 ) & (dY <= obj.sliderdY)) OR ((delta < 0) & (dY >= obj.sliderdY)) THEN delta := 0 END;
  219.             IF (delta > 0) & (h = obj.sliderdY + obj.sliderH) THEN 
  220.                 myOld := my; sdY := obj.sliderdY; delta := 0;
  221.                 IF myOld < y THEN myOld := y END
  222.             ELSIF (delta < 0) & (obj.sliderdY = 0 ) THEN
  223.                 myOld := my; sdY := 0; delta := 0;
  224.                 IF myOld >= y + h THEN myOld := y + h - 1 END
  225.             END;
  226.             IF dY <  0 THEN dY := 0
  227.             ELSIF dY > h - minH THEN dY := h - minH
  228.             END;
  229.         UNTIL keys = {};
  230.         IF keysum # Cancel THEN
  231.             obj.DrawSlider(FALSE)
  232.         ELSE
  233.             obj.UpdateView(FALSE, dYOld)
  234.         END
  235.     END TrackSlider;
  236. Syntax10.Scn.Fnt
  237.     VAR keys: SET; fast: BOOLEAN;
  238.     BEGIN
  239.         suspendTime := Input.Time();
  240.         IF my >= obj.y + obj.h -obj.w - obj.sliderdY THEN
  241.             Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  242.             fast := FALSE;
  243.             REPEAT
  244.                 IF (keysum # {}) & (my >= obj.y + obj.h -obj.w - obj.sliderdY) & (my < obj.y + obj.h -obj.w) THEN
  245.                     time := Input.Time();
  246.                     IF time >= suspendTime THEN
  247.                         IF fast THEN suspendTime := time + middleDelay
  248.                         ELSE fast := TRUE; suspendTime := time + highDelay
  249.                         END;
  250.                         obj.PageUp
  251.                      END
  252.                 END;
  253.                 Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  254.                 keysum := keysum + keys
  255.             UNTIL keys = {};
  256.         ELSIF my >= obj.y + obj.h -obj.w -obj.sliderdY - obj.sliderH THEN
  257.             obj.TrackSlider(mx, my, keysum)
  258.         ELSE
  259.             Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  260.             fast := FALSE;
  261.             REPEAT
  262.                 IF (keysum # {}) & (my >= obj.y + obj.w) & (my < obj.y + obj.h -obj.w - obj.sliderdY - obj.sliderH) THEN
  263.                     time := Input.Time();
  264.                     IF time >= suspendTime THEN
  265.                         IF fast THEN suspendTime := time + middleDelay
  266.                         ELSE fast := TRUE; suspendTime := time + highDelay
  267.                         END;
  268.                         obj.PageDown
  269.                      END
  270.                 END;
  271.                 Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
  272.                 keysum := keysum + keys
  273.             UNTIL keys = {};
  274.         END
  275.     END TrackSliderBar;
  276. Syntax10.Scn.Fnt
  277.     BEGIN
  278.         obj.F := F;
  279.         IF (keysum # {}) & (obj.w >= obj.minW) & (obj.h >= 2*obj.w) THEN    
  280.             Oberon.RemoveMarks(obj.x, obj.y, obj.w, obj.h);
  281.             IF my < obj.y + obj.w THEN obj.TrackDownButton(mx, my, keysum)
  282.             ELSIF my >= obj.y + obj.h - obj.w THEN obj.TrackUpButton(mx, my, keysum)
  283.             ELSIF obj.h >= 2*obj.w + obj.sliderH THEN obj.TrackSliderBar(mx, my, keysum)
  284.             END;
  285.         END
  286.     END HandleScrollBar;
  287. Syntax10.Scn.Fnt
  288.     highDelay := Input.TimeUnit DIV 2;
  289.     middleDelay := Input.TimeUnit DIV 3;
  290.     lowDelay := Input.TimeUnit DIV 18;
  291.     backgroundCol := middlegrey;
  292.     upArrowImage[0] := {};    downArrowImage[0] := {};    
  293.     upArrowImage[1] := {2..4};    downArrowImage[7] := {2..4};
  294.     upArrowImage[2] := {2..4};    downArrowImage[6] := {2..4};
  295.     upArrowImage[3] := {2..4};    downArrowImage[5] := {2..4}; 
  296.     upArrowImage[4] := {0..6};    downArrowImage[4] := {0..6};
  297.     upArrowImage[5] := {1..5};    downArrowImage[3] := {1..5};
  298.     upArrowImage[6] := {2..4};    downArrowImage[2] := {2..4};
  299.     upArrowImage[7] := {3};    downArrowImage[1] := {3};
  300.     upArrow := Display.NewPattern(upArrowImage, 7, 7);
  301.     downArrow := Display.NewPattern(downArrowImage, 7, 7);
  302.     downPatW := 7; downPatH := 7;
  303.     upPatW := 7; upPatH := 7;
  304. MODULE ScrollBars;
  305. IMPORT Display, Input, Oberon;
  306. CONST
  307.     MR = 0; MM = 1; ML = 2; Cancel = {ML, MM, MR};
  308.     black = 15; darkgrey = 14; middlegrey = 13; lightgrey = 12; white = 0;
  309.     patternCol = darkgrey; backCol = white;
  310.     ScrollBarElem* = POINTER TO ScrollBarElemDesc;
  311.     ScrollBarElemDesc* = RECORD
  312.         F*: Display.Frame;
  313.         x-, y-, w-, h-: INTEGER;
  314.         minW-, sliderdY-, sliderH-: INTEGER;
  315.         backgroundCol: INTEGER;
  316.         downArrow, upArrow: Display.Pattern;
  317.         downdX, downdY, updX, updY: INTEGER;;
  318.         downW, downH, upW, upH: INTEGER;
  319.     END;
  320.     backgroundCol: INTEGER;
  321.     downArrow, upArrow: Display.Pattern;
  322.     downArrowImage, upArrowImage, pat: ARRAY 9 OF SET;
  323.     downPatW, upPatW, downPatH, upPatH: INTEGER;
  324.     lowDelay, middleDelay, highDelay, suspendTime, time: LONGINT;
  325.     PROCEDURE DrawButton(pressed: BOOLEAN; pat: Display.Pattern; patX, patY, X, Y, W, H: INTEGER);
  326.     PROCEDURE (obj: ScrollBarElem) Init*;
  327.     PROCEDURE (obj: ScrollBarElem) CalculateSliderDim* (length, beg, end: LONGINT);
  328.     PROCEDURE (obj: ScrollBarElem) SetDim* (x, y, w, h: INTEGER); 
  329.     PROCEDURE (obj: ScrollBarElem) LineDown*;
  330.     PROCEDURE (obj: ScrollBarElem) LineUp*;
  331.     PROCEDURE (obj: ScrollBarElem) PageDown*;
  332.     PROCEDURE (obj: ScrollBarElem) PageUp*;
  333.     PROCEDURE (obj: ScrollBarElem) DrawSlider* (pressed : BOOLEAN);
  334.     PROCEDURE (obj: ScrollBarElem) Update* (sliderPressed: BOOLEAN; length, beg, end: LONGINT);
  335.     PROCEDURE (obj: ScrollBarElem) UpdateView*(pressed: BOOLEAN; dY: INTEGER);
  336.     PROCEDURE (obj: ScrollBarElem) DrawDownButton* (pressed : BOOLEAN);
  337.     PROCEDURE (obj: ScrollBarElem) DrawUpButton* (pressed : BOOLEAN);
  338.     PROCEDURE (obj: ScrollBarElem) Draw*;
  339.     PROCEDURE (obj: ScrollBarElem) TrackDownButton* (VAR mx, my : INTEGER; VAR keysum : SET);
  340.     PROCEDURE (obj: ScrollBarElem) TrackUpButton* (VAR mx, my : INTEGER; VAR keysum : SET);
  341.     PROCEDURE (obj: ScrollBarElem) TrackSlider* (VAR mx, my : INTEGER; VAR keysum : SET);
  342.     PROCEDURE (obj: ScrollBarElem) TrackSliderBar*(VAR mx, my : INTEGER; VAR keysum : SET);
  343.     PROCEDURE (obj: ScrollBarElem) HandleScrollBar* (F: Display.Frame; mx, my : INTEGER; 
  344.                                                                                         keysum : SET);
  345. BEGIN
  346. END ScrollBars.
  347.